package cz.benky.webdav.service; import com.google.common.io.CountingInputStream; import com.netflix.astyanax.connectionpool.exceptions.ConnectionException; import cz.benky.webdav.dao.CassandraDao; import cz.benky.webdav.dao.CassandraFileDao; import cz.benky.webdav.util.PathUtils; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.io.InputContext; import java.io.OutputStream; import java.util.UUID; import static cz.benky.webdav.util.PathUtils.getParentDirectory; public class FileStorageService { private final CassandraDao cassandraDao; private final CassandraFileDao cassandraFileDao; public FileStorageService(final CassandraDao cassandraDao, final CassandraFileDao cassandraFileDao) { this.cassandraDao = cassandraDao; this.cassandraFileDao = cassandraFileDao; } public void deleteFile(final String path) { final UUID file = cassandraDao.getFile(path); final String parentDirectory = PathUtils.getParentDirectory(path); final String fileName = PathUtils.getFileName(path); final UUID parent = cassandraDao.getFile(parentDirectory); // remove possible file content try { cassandraDao.deleteFromDirectory(parent, fileName); cassandraFileDao.deleteFile(file); } catch (ConnectionException e) { throw new RuntimeException(e); } } public void readFile(String fileName, OutputStream os) { final UUID file = cassandraDao.getFile(fileName); cassandraFileDao.readFile(file.toString(), os); } public long getFileSize(String fileName) { try { return cassandraFileDao.getFileSize(cassandraDao.getFile(fileName)); } catch (ConnectionException e) { throw new RuntimeException(e); } } public void createFile(final String fullFilePath, final InputContext inputContext) throws DavException { if (cassandraDao.getFile(fullFilePath) != null) { throw new DavException(DavServletResponse.SC_CONFLICT); } final String parentDirectory = getParentDirectory(fullFilePath); final String fileName = PathUtils.getFileName(fullFilePath); final UUID parentId = cassandraDao.getFile(parentDirectory); try { final UUID fileUUID = cassandraFileDao.createFile(parentId, fileName); if (inputContext.hasStream() && inputContext.getContentLength() >= 0) { final CountingInputStream countingInputStream = new CountingInputStream(inputContext.getInputStream()); cassandraFileDao.writeFile(fileUUID, countingInputStream); cassandraFileDao.updateFileInfo(fileUUID, countingInputStream.getCount()); } } catch (ConnectionException e) { throw new RuntimeException(e); } } }